#ifndef MEM_POOL_H
#define MEM_POOL_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdlib.h>


struct mem_pool;

typedef struct mem_pool mem_pool_t;

/* 返回值定义 */
enum
{
    ERR_NO_MEM = 1, // 内存不足
    ERR_PARAM,      // 参数错误
    ERR_INTER       // 内部错误
};

/*
 * 初始化内存池
 * @param pool        调用者定义mem_pool_t*, 传入指针，由接口申请内存
 * @param max_alloc   最大可分配字节数
 * @param num_level   level数组大小
 * @param levels      level数组
 * @param concurrency 是否支持并发
 * @return      0表示成功, 其他ERR_*
 * @note          level数组指明预分配块大小, 是可容纳alloc请求的最小块
 *                例如 levels[] = {32,64,128,256,512}  alloc(pool, 36)将返回64字节大小的块
 */
int mempool_init(mem_pool_t **pool, int max_alloc, int num_level, int *levels, int concurrency);


/*
 * 通过内存池接口申请内存
 * @param pool    pool句柄
 * @param size    申请内存大小，单位byte
 * @return        成功返回内存首地址，失败返回NULL
 */
void *mempool_alloc(mem_pool_t *pool, size_t siz);


/*
 * 释放内存
 * @param pool  pool句柄 
 * @param ptr   待释放内存首地址
 * @return      无
 */
void mempool_free(mem_pool_t *pool, void *p);


/*
 * 销毁内存池
 * @param  pool   pool句柄, 内部将*pool置NULL
 */
void mempool_destroy(mem_pool_t **pool);

/*
 * 显示内存池信息
 * @param desc      描述信息
 * @param p         pool句柄
 */
void mempool_dump(char *desc, mem_pool_t *p);


void dump_mem_node(void *p);

#ifdef __cplusplus
}
#endif

#endif
